import express from 'express'
import cors from 'cors'

import websocketController from './websocket.js'

const app = express()

app.use(express.static("public"))

app.use(cors())

/**
 * 获取服务端时间
 *
 * 前端代码 index.html (短轮询) 和 index-2.html （长轮询）
 */
app.get('/getTime', (req, res) => {
  res.send(
    new Date().toLocaleString()
  )
})


/**
 * 前端使用 iframe实现和客户端一直连接
 *
 * 前端代码 index-3.html
 */
app.get('/iframe/getTime', async (req, res) => {

  // 这里不能使用 res.end 和 res.send 等， 因为这些方法底层会 关闭掉 HTTP 连接

  const sendMsg = () => {
    res.write(
      `
        <script>
          var  el = parent.document.querySelector('#time')
          document.domain = 'localhost'

          el.innerHTML = "${new Date().toLocaleString()}"
        </script>
      `
    )
  }

  // 服务端1s发一次
  setInterval(() => {
    sendMsg()
  }, 1000)

})

/**
 * 使用 postmessage发送消息
 * 避免 origin  同源问题
 *
 */
app.get('/iframe/postmessage', async (req, res) => {
  function sendMsg () {
    res.write(
      `
        <script>
        parent.window.postMessage("${new Date().toLocaleString()}", "*")
        </script>
      `
    )
  }
  // 服务端1s发一次
  setInterval(() => {
    sendMsg()
  }, 1000)

})

/**
 * 对应 sse 实现
 * 前端 index-5.html
 */
app.get('/sse-eventsource', async (req, res)  => {

  res.setHeader('Content-Type', 'text/event-stream')

  // 注意：EventSource 是有格式要求的， 必须以 data: 开头， 以 \n\n 换行结尾， 这是跟HTTP 报文是一样的

  const sendMsg = () => {
    // res.write(
    //   `data: ${new Date().toLocaleString()} \n\n`
    // )
    let t = new Date().toLocaleString()
    let id = parseInt(Math.random() * 10)

    // 可以传递 json，本质还是 字符串 json， 前端自己去解析一下
    let data = JSON.stringify({
      id: id,
      tiem: t,
      name: '张三',
      age: 12
    })

    res.write(
      `id: ${id}\nevent:my-event\ndata:${data}\n\n`
    )
  }

  setInterval(() => {
    sendMsg()
  }, 1000)

})

websocketController(app)

app.listen(3001, () => {
  console.log('服务启动 http://localhost:3001');
})

